<?php namespace Common\Model;
use Hdphp\Model\Model;
/**
 * 文章分类模型
 */
class Category extends Model{
		//指定表名
		protected $table = 'category';
		//需要验证的字段（自动验证）
		protected $validate = array(
				//1.表单的name名，2.规则，3.错误信息 4.验证条件 5.验证时间
				array('cname','required','分类名称必须填写哦^_^',3,3),
				array('cname','maxlen:10','分类名称不能大于10个字符^_^',3,3),
				array('ctitle','required','标题必须填写哦^_^',3,3),
				array('ckeywords','required','关键字必须填写哦^_^',3,3),
				array('cdes','required','分类描述必须填写^_^',3,3),
				array('csort','required','排序必须填写哦^_^',3,3),
				array('csort','num:0,65535','排序必须为数字哦^_^',3,3)
		);
		
		//添加
		public function store(){
				//触发自动验证
				if (!$this->create()) return false;
				//验证通过，把数据写入数据库,添加成功后会返回一个自增的ID值
				return $this->add();
		}
		
		//编辑
		public function edit($cid){
				//如果验证通过,执行编辑操作
				if ($this->create()) {
						//为什么不直接返回他呢，因为在执行更新操作的时候,不更新数据时返回影响条数0就是假
						$this->where(array('cid' => $cid))->save();
						return true;
				}
				//验证不通过时,返回false
				return false;
		}
		
		//删除
		public function del($cid){
				//查询自身的pid
				$where = array('cid' =>$cid);
				//查询父类的PID
				$pid = $this->where($where)->pluck('pid');
				//在把有子类的PID修改为分类的pid值
				$this->where(array('pid' =>$cid ))->save(array('pid' =>$pid ));
				//删除自身
				return $this->delete($cid);
		}
		
		//编辑
		/**
		 * [getNoMine 获得除了自身和自身的所有的子集]
		 * @return [type] [description]
		 */
		public function getNoMine($cid){
				//1.获取自身所有的子集
				$cids = $this->getSon($this->get(),$cid);
				//2.压入自身的cid
				$cids[] = $cid;
				//3.排除
				$data = $this->where("cid NOT IN(" . implode(',', $cids) . ")")->get();
				//树形数据,并且返回
				return Data::tree($data,'cname');
		}
		
		/**
		 * 获取所有的子集
		 * @param array $data 所有的数据
		 * @param string $cid  分类的自增ID
		 */
		private function getSon($data,$cid){
				//用于存储cid,声明静态变量是为了在递归调用时,数据不会被丢失
				static $temp = array();
				/* +-----+------------+-----+
				| cid | cname      | pid |
				+-----+------------+-----+
				|   1 | 军事       		 |   0 |
				|   5 | 国际新闻  	 |   0 |
				|   6 | 国内军事   	 |   1 |
				|   8 | 娱乐抢先看	 |   0 |
				|  10 | 果果军事   	 |   1 |
				|  11 | 国外军事   	 |   1 |
				|  12 | 后盾网     	 |   6 |
				+-----+------------+-----+ */
				/*父级不能是自身和自身的所有子集*/
				foreach ($data as $v) {
					 if ($v['pid'] == $cid) {
					 		$temp[] = $v['cid'];
					 		//递归调用
					 		$this->getSon($data,$v['cid']);
					 }
				}
				return $temp;
		}
}